/**
 * Copyright 2012 João Paulo Macedo da Silva
 * 
 * Este arquivo é parte do programa siri-musical
 * 
 * siri-musical é um software livre; você pode redistribui-lo e/ou 
 * modifica-lo dentro dos termos da Licença Pública Geral GNU como 
 * publicada pela Fundação do Software Livre (FSF); na versão 3 da 
 * Licença.
 * 
 * Este programa é distribuido na esperança que possa ser util, 
 * mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
 * MERCADO ou APLICAÇÃO EM PARTICULAR.
 * Veja a Licença Pública Geral GNU para maiores detalhes.
 * 
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU
 * junto com este programa, se não, escreva para a Fundação do Software
 * Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

package Unique;

import javax.microedition.lcdui.*;
import javax.microedition.media.Manager;
import javax.microedition.midlet.*;

/**
 * Classe principal, a qual cria a interface gráfica.
 * @author João Paulo Macedo da Silva <jpaulog12@yahoo.com.br>
 */

public class Main extends MIDlet implements CommandListener {
    private Display d = Display.getDisplay(this);
    
    //Botões
    private Command btStart     = new Command("Iniciar"   , Command.ITEM, 0); //> Inicia o treinamento
    private Command btExit      = new Command("Sair"      , Command.ITEM, 1); //> Sai do programa
    private Command btAbout     = new Command("Sobre"     , Command.ITEM, 2); //> Direitos autorais
    private Command btSelNote   = new Command("OK"        , Command.EXIT, 3); //> Verifica se a nota selecionada é igual a nota aleatória
    private Command btPlayAgain = new Command("Tocar nota", Command.ITEM, 4); //> Reproduz a nota atual
    private Command btNewNote   = new Command("Nova nota" , Command.ITEM, 5); //> Seleciona uma nova nota
    private Command btGiveUp    = new Command("Desistir"  , Command.ITEM, 6); //> Desistir: Mostra a nota
    private Command btBack      = new Command("Voltar"    , Command.ITEM, 7); //> Volta para o menu principal
    
    //
    private int Note = 0; //> nota selecionada
    
    //Menu1
    private List lsNotes = new List("Selecione as notas", List.MULTIPLE, Notes.getNotes(), null); //> lista com as notas a serem sorteadas
    
    //Menu2
    private List lsNotes2 = new List("Selecione as notas", List.EXCLUSIVE, Notes.getNotes(), null); //> lista com as notas para selecionar a nota sorteada

    /**
     * Ativa o menu principal
     */
    private void getMainMenu() {
        this.d.setCurrent(lsNotes);
    }
    
    /**
     * Ativa a tela de sorteio
     */
    private void getPiano() {
        //Selecionar a primeira nota
        this.lsNotes2.setSelectedIndex(0, true);

        //Contar selecionados
        int sel = 0;
        for (int i = 0; i < this.lsNotes.size(); i++) {
            if (this.lsNotes.isSelected(i))
               sel++; 
        }
        
        //No caso de não haver nenhum selecionado, selecionar todos
        if (sel == 0) {
            for (int i = 0; i < this.lsNotes.size(); i++)
                this.lsNotes.setSelectedIndex(i, true);
            sel = this.lsNotes.size() -1;
        }
        
        //Copiar todos os selecionados para um vetor
        String[] arrayNotes = new String[sel +1];
        int j = 0;
        for (int i = 0; i < this.lsNotes.size(); i++) {
            if (this.lsNotes.isSelected(i)) {
               arrayNotes[j++] = this.lsNotes.getString(i);
            }
        }

        //
        this.Note = Notes.getRandomNote(arrayNotes);
        
        this.d.setCurrent(this.lsNotes2);
        this.playSound(this.Note);
    }
    
    /**
     * Ativa a tela de direitos autorais
     */
    private void getAbout() {
        //
        Form f = new Form("Sobre");
        StringBuffer msg = new StringBuffer();
        
        //Mensagem
        msg.append("Copyright:\n");
        msg.append("2012 JOÃO PAULO MACEDO DA SILVA\n");
        msg.append("http://code.google.com/p/siri-musical/\n\n");
        msg.append("siri-musical é um software livre; você pode redistribui-lo"
                + " e/ou modifica-lo dentro dos termos da Licença Pública Geral GNU"
                + " como publicada pela Fundação do Software Livre (FSF);"
                + " na versão 3 da Licença.");
        
        //Exibir
        f.append(msg.toString());
        f.addCommand(btBack);
        this.d.setCurrent(f);
    }
    
    /**
     * Desistir: Mostra a nota que foi sorteada
     */
    private void setGiveUp() {
        String note = Notes.getNote(this.Note);
        for (int i = 0; i < this.lsNotes2.size(); i++)
            if (this.lsNotes2.getString(i).equals( note )) {
                this.lsNotes2.setSelectedIndex(i, true);
                return;
            }
    }
    
    public void startApp() {
        //Cria o menu principal
        this.lsNotes.addCommand(this.btStart);
        this.lsNotes.addCommand(this.btExit);
        this.lsNotes.addCommand(this.btAbout);
        this.lsNotes.setCommandListener(this);
        
        //Cria o menu de sorteio
        this.lsNotes2.addCommand(this.btBack);
        this.lsNotes2.addCommand(this.btSelNote);
        this.lsNotes2.addCommand(this.btBack);
        this.lsNotes2.addCommand(this.btPlayAgain);
        this.lsNotes2.addCommand(this.btNewNote);
        this.lsNotes2.addCommand(this.btGiveUp);
        this.lsNotes2.setCommandListener(this);
        
        //Inicializa o programa
        this.getMainMenu();
    }
    
    public void pauseApp() {}
    public void destroyApp(boolean unconditional) {}
    
    public void commandAction(Command c, Displayable d) {
        if (c == this.btExit)
            this.notifyDestroyed();
        
        if (c == this.btStart)
            this.getPiano();
        
        if (c == this.btBack)
            this.getMainMenu();
        
        if (c == this.btPlayAgain)
            this.playSound(this.Note);
        
        if (c == this.btNewNote)
            this.getPiano();
        
        if (c == this.btGiveUp)
            setGiveUp();
        
        if (c == this.btAbout)
            this.getAbout();
        
        if (c == this.btSelNote) {
            int sel = this.lsNotes2.getSelectedIndex();
            String note = this.lsNotes2.getString(sel);
            if (Notes.isNote(note, this.Note))
                getPiano();
        }
    }
    
    /**
     * Reproduz o som
     * @param tone Inteiro com o valor do tom.
     * @see http://developers.sun.com/mobility/midp/articles/mmapioverview/index.html
     */
    private void playSound(int tone) {
        try {
            int time = 1000;
            int vol = 100;
            Manager.playTone(tone, time, vol);
        } catch (Exception e) {}
    }
}
